﻿Imports DevExpress.XtraLayout
Imports DevExpress.XtraEditors
Imports IControl.IControls
Imports System.Drawing
Imports DevExpress.XtraGrid.Views.Grid

Module Editor
    ''' <summary>
    ''' kiểm tra một tham trị có tồn tại trong một danh sách giá trị của cột xtragrid không ?
    ''' </summary>
    ''' <param name="igridView1">igridview</param>
    ''' <param name="columnName1">tên cột dữ liệu</param>
    ''' <param name="value">giá trị nhập vô</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getExistColumnValue(ByVal igridView1 As IGridView, ByVal columnName1 As String, ByVal value As String) As Boolean
        For index = 0 To igridView1.RowCount - 2
            Try
                If igridView1.GetRowCellValue(index, columnName1).ToString.ToUpper = value.ToString.ToUpper Then
                    Return True
                    Exit Function
                End If
            Catch ex As Exception
                MessageBox.Show("getExistColumnValue " & ex.Message)
            End Try
        Next
        Return False
    End Function
    Public Sub setGridtoGrid(ByVal igrid1 As IGridView, ByVal igrid2 As IGridView, ByVal ht As Hashtable, ByVal keyColumnName_igrid1 As String, ByVal keycolumnName_igrid2 As String)
        igrid1.setUpdateData()
        For index = 0 To igrid1.RowCount - 1 'duyệt từ gridcheck (igrid1) - 
            If CBool(igrid1.GetRowCellValue(index, "Mark")) = True AndAlso getExistColumnValue(igrid2, keycolumnName_igrid2, igrid1.GetRowCellValue(index, keyColumnName_igrid1).ToString) = False Then
                'kiểm tra coi item.value có trong danh sách cột của igrid2 không ?
                Dim Item As DictionaryEntry
                'Dim item As SortedDictionary(Of tkey,FirstDa
                For Each Item In ht
                    Dim key As String = Item.Key.ToString
                    Dim value As String = Item.Value.ToString
                    If igrid1.Columns.Contains(igrid1.Columns(key)) Then 'kiểm tra cột igrid1 hợp lệ
                        'kiểm tra coi item.key có trong danh sách cột của igrid2 không
                        If igrid2.Columns.Contains(igrid2.Columns(value)) Then 'kiểm tra cột của igrid2 hợp lệ
                            igrid2.AddNewRow()
                            'MessageBox.Show("key" & key & " value" & value)
                            MessageBox.Show("grid1 " & igrid1.GetRowCellValue(index, key))
                            igrid2.SetFocusedRowCellValue(value, igrid1.GetFocusedRowCellValue(key))
                            'MessageBox.Show(igrid2.GetRowCellValue(index, value))
                        Else 'nếu không có trong danh sách cột --> báo 
                            DevExpress.XtraEditors.XtraMessageBox.Show("Cột '" & Item.Value.ToString & "' không tồn tại trong " & igrid2.Name.ToString & ", bạn coi lại hàm 'setGridtoGrid' ?", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                        End If
                        'igrid2.setUpdateData()
                        igrid1.SetRowCellValue(index, "Mark", False)
                    Else
                        DevExpress.XtraEditors.XtraMessageBox.Show("Cột '" & Item.Key.ToString & "' không tồn tại trong " & igrid1.Name.ToString & ", bạn coi lại hàm 'setGridtoGrid' ?", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    End If
                Next
            End If

        Next

        'Delete row cuối cùng bị dư
        If IsDBNull(igrid2.GetFocusedRowCellValue(keycolumnName_igrid2)) Then
            igrid2.DeleteSelectedRows()
        End If
        'Duyệt xem trong grid có dòng dư
        For index = 0 To igrid2.RowCount
            If IsDBNull(igrid2.GetRowCellValue(index, keycolumnName_igrid2)) Then
                igrid2.DeleteRow(index)
            End If
        Next
    End Sub
    ''' <summary>
    ''' lấy ngày cuối năm của một date
    ''' </summary>
    ''' <param name="ngay">ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayCuoiNam(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, 12, 31)
    End Function
    ''' <summary>
    ''' lấy ngày đầu năm của một date
    ''' </summary>
    ''' <param name="ngay">giá trị date</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayDauNam(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, 1, 1)
    End Function
    ''' <summary>
    ''' lấy ngày cuối tháng
    ''' </summary>
    ''' <param name="ngay"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayCuoiThang(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, ngay.Month, Date.DaysInMonth(ngay.Year, ngay.Month))
    End Function
    ''' <summary>
    ''' Lấy ngày đầu tháng
    ''' </summary>
    ''' <param name="ngay">Ngày</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getNgayDauThang(ByVal ngay As Date) As Date
        Return New Date(ngay.Year, ngay.Month, 1)
    End Function
    Public Sub setDMThoiGian(ByVal sle As ISearchLookupEdit, ByVal tungay As IDateEdit, ByVal denngay As IDateEdit)
        If IsDBNull(sle.EditValue) Or IsNothing(sle.EditValue) Then
            Exit Sub
        Else
            If sle.EditValue = "TN" Then
                tungay.EditValue = getNgayDauThang(Today)
                denngay.EditValue = getNgayCuoiThang(Today)
            End If
            If sle.EditValue = "TT" Then
                tungay.EditValue = getNgayDauThang(Today.Date.AddMonths(-1))
                denngay.EditValue = getNgayCuoiThang(Today.Date.AddMonths(-1))
            End If
            If sle.EditValue = "T1" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 1, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 1, 1))
            End If
            If sle.EditValue = "T2" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 2, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 2, 1))
            End If
            If sle.EditValue = "T3" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 3, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 3, 1))
            End If
            If sle.EditValue = "T4" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 4, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 4, 1))
            End If
            If sle.EditValue = "T5" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 5, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 5, 1))
            End If
            If sle.EditValue = "T6" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 6, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 6, 1))
            End If
            If sle.EditValue = "T7" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 7, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 7, 1))
            End If
            If sle.EditValue = "T8" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 8, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 8, 1))
            End If
            If sle.EditValue = "T9" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 9, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 9, 1))
            End If
            If sle.EditValue = "T10" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 10, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 10, 1))
            End If
            If sle.EditValue = "T11" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 11, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 11, 1))
            End If
            If sle.EditValue = "T12" Then
                tungay.EditValue = getNgayDauThang(New Date(Today.Year, 12, 1))
                denngay.EditValue = getNgayCuoiThang(New Date(Today.Year, 12, 1))
            End If
            If sle.EditValue = "All" Then
                tungay.EditValue = getNgayDauNam(Today)
                denngay.EditValue = getNgayCuoiNam(Today)
            End If
        End If
    End Sub
    Public Function setPostEditor(ByVal lc As LayoutControl) As Boolean
        Dim ActiveCtrl As Control = lc.ActiveControl
        If TypeOf ActiveCtrl Is DevExpress.XtraEditors.TextBoxMaskBox Then
            ActiveCtrl = ActiveCtrl.Parent
        End If
        If TypeOf ActiveCtrl Is DevExpress.XtraEditors.BaseEdit Then
            Return CType(ActiveCtrl, DevExpress.XtraEditors.BaseEdit).DoValidate()
        End If
        Return True
    End Function
    Public Sub setAppearanceSearchLookupEdit(ByVal lc As LayoutControl, ByVal view As GridView)
        For Each item In lc.Items
            If TypeOf item Is LayoutControlItem Then
                Dim ct As Control = DirectCast(item, LayoutControlItem).Control
                If TypeOf ct Is BaseEdit Then
                    If TypeOf ct Is ISearchLookupEdit Then
                        DirectCast(ct, ISearchLookupEdit).Properties.View.OptionsView.EnableAppearanceEvenRow = True
                        DirectCast(ct, ISearchLookupEdit).Properties.View.Appearance.EvenRow.BackColor = Color.LightCyan
                    End If
                End If
            End If
        Next
    End Sub
    Public Sub setReadonlyTag(ByVal lc As LayoutControl)
        For Each item In lc.Items
            If TypeOf item Is LayoutControlItem Then
                Dim ct As Control = DirectCast(item, LayoutControlItem).Control
                If TypeOf ct Is BaseEdit Then
                    'CType(ct, BaseEdit).Properties.ReadOnly = b
                    If TypeOf ct Is ISearchLookupEdit Then
                        If DirectCast(ct, ISearchLookupEdit).Properties.ReadOnly Then
                            DirectCast(ct, ISearchLookupEdit).Properties.Tag = "True"
                            DirectCast(ct, ISearchLookupEdit).TabStop = False
                        End If
                    End If
                    If TypeOf ct Is ITextEdit Then
                        If DirectCast(ct, ITextEdit).Properties.ReadOnly Then
                            DirectCast(ct, ITextEdit).Properties.Tag = "True"
                            DirectCast(ct, ITextEdit).TabStop = False
                        End If
                    End If
                    If TypeOf ct Is IDateEdit Then
                        If DirectCast(ct, IDateEdit).Properties.ReadOnly Then
                            DirectCast(ct, IDateEdit).Properties.Tag = "True"
                            DirectCast(ct, IDateEdit).TabStop = False
                        End If
                    End If
                    If TypeOf ct Is IMeMoEdit Then
                        If DirectCast(ct, IMeMoEdit).Properties.ReadOnly Then
                            DirectCast(ct, IMeMoEdit).Properties.Tag = "True"
                            DirectCast(ct, IMeMoEdit).TabStop = False
                        End If
                    End If
                End If
            End If
        Next
    End Sub

    Public Sub setReadonly(ByVal lc As LayoutControl, ByVal b As Boolean)
        For Each item In lc.Items
            If TypeOf item Is LayoutControlItem Then
                Dim ct As Control = DirectCast(item, LayoutControlItem).Control
                If TypeOf ct Is BaseEdit Then
                    'CType(ct, BaseEdit).Properties.ReadOnly = b
                    If TypeOf ct Is ISearchLookupEdit Then
                        If DirectCast(ct, ISearchLookupEdit).Properties.Tag <> "True" Then
                            DirectCast(ct, ISearchLookupEdit).Properties.ReadOnly = b
                        End If
                        If b Then
                            DirectCast(ct, ISearchLookupEdit).Properties.Buttons(0).Visible = False
                            DirectCast(ct, ISearchLookupEdit).Properties.NullText = ""
                        Else
                            DirectCast(ct, ISearchLookupEdit).Properties.Buttons(0).Visible = True
                            DirectCast(ct, ISearchLookupEdit).Properties.NullText = "[Chọn]"
                        End If
                    End If
                    If TypeOf ct Is ITextEdit Then
                        If DirectCast(ct, ITextEdit).Properties.Tag <> "True" Then
                            DirectCast(ct, ITextEdit).Properties.ReadOnly = b
                        End If
                    End If
                    'bổ sung checkedit - icheckedit
                    If TypeOf ct Is CheckEdit Then
                        If DirectCast(ct, CheckEdit).Properties.Tag <> "True" Then
                            DirectCast(ct, CheckEdit).Properties.ReadOnly = b
                        End If
                    End If
                    If TypeOf ct Is ICheckEdit Then
                        If DirectCast(ct, ICheckEdit).Properties.Tag <> "True" Then
                            DirectCast(ct, ICheckEdit).Properties.ReadOnly = b
                        End If
                    End If
                    'end
                    If TypeOf ct Is IDateEdit Then
                        If DirectCast(ct, IDateEdit).Properties.Tag <> "True" Then
                            DirectCast(ct, IDateEdit).Properties.ReadOnly = b
                        End If
                        If b Then
                            DirectCast(ct, IDateEdit).Properties.Buttons(0).Visible = False
                        Else
                            DirectCast(ct, IDateEdit).Properties.Buttons(0).Visible = True
                        End If
                    End If
                    If TypeOf ct Is IMeMoEdit Then
                        If DirectCast(ct, IMeMoEdit).Properties.Tag <> "True" Then
                            DirectCast(ct, IMeMoEdit).Properties.ReadOnly = b
                            'MyBase.BorderStyle = BorderStyles.NoBorder
                            ''MyBase.SetStyle(ControlStyles.UserPaint, True)
                            'MyBase.UpdateStyles()
                            'Me.EnterMoveNextControl = True
                            'MyBase.Properties.AllowNullInput = DefaultBoolean.True
                            'ControlPaint.DrawBorder(pe.Graphics, pe.ClipRectangle, MyBase.Parent.BackColor, 0, ButtonBorderStyle.Solid, MyBase.Parent.BackColor, 0, ButtonBorderStyle.Solid, MyBase.Parent.BackColor, 0, ButtonBorderStyle.Solid, Color.Black, 1, ButtonBorderStyle.Dotted)
                        End If
                    End If
                End If
            End If
        Next
    End Sub
    Public Sub setVisible(ByVal lc As LayoutControl, ByVal b As Boolean)
        For Each item In lc.Items
            If TypeOf item Is LayoutControlItem Then
                Dim ct As Control = DirectCast(item, LayoutControlItem).Control
                'If TypeOf ct Is BaseEdit Then
                '    If TypeOf ct Is SearchLookUpEdit Then
                '        DirectCast(ct, SearchLookUpEdit).Visible = b
                '    End If
                '    If TypeOf ct Is TextEdit Then
                '        DirectCast(ct, TextEdit).Visible = b
                '    End If
                '    If TypeOf ct Is DateEdit Then
                '        DirectCast(ct, TextEdit).Visible = b
                '    End If
                'End If

            End If
        Next
    End Sub
    Public Function NumToText(ByVal s As String) As String
        Dim So() As String = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"} 'Cái này nên để người dùng tự nhập vào vì có nhiều bảng mã khác nhau 
        Dim So1() As String = {"lẻ", "mốt", "tư", "lăm", "mười", "mươi"}
        Dim Hang() As String = {"", "ngàn", "triệu", "tỷ"}
        Dim I, J, donvi, chuc, tram As Integer
        Dim StrValue As String
        StrValue = ""
        I = Len(s)
        For J = 0 To I - 1
            If Microsoft.VisualBasic.Left(s, 1) = "0" Then
                s = Microsoft.VisualBasic.Right(s, I - J)
            End If
        Next J
        If s = "0" Then
            NumToText = So(0)
            Exit Function
        End If
        I = Len(s)
        If I = 0 Then
            StrValue = ""
        Else
            J = 0
            Do While I > 0
                donvi = Int(Mid(s, I, 1))
                I = I - 1
                If I > 0 Then
                    chuc = Int(Mid(s, I, 1))
                Else
                    chuc = -1
                End If
                I = I - 1
                If I > 0 Then
                    tram = Int(Mid(s, I, 1))
                Else
                    tram = -1
                End If
                I = I - 1
                If donvi > 0 Or chuc > 0 Or tram > 0 Or J = 3 Then
                    StrValue = Hang(J) & " " & StrValue
                End If
                J = J + 1
                If J > 3 Then
                    J = 1
                End If
                If donvi = 1 And chuc > 1 Then
                    StrValue = So1(1) & " " & StrValue
                ElseIf donvi = 4 And chuc > 1 Then
                    StrValue = So1(2) & " " & StrValue
                Else
                    If donvi = 5 And chuc > 0 Then
                        StrValue = So1(3) & " " & StrValue
                    ElseIf donvi > 0 Then
                        StrValue = So(donvi) & " " & StrValue
                    End If
                End If
                If chuc < 0 Then
                    Exit Do
                Else
                    If chuc = 0 And donvi > 0 Then
                        StrValue = So1(0) & " " & StrValue
                    ElseIf chuc = 1 Then
                        StrValue = So1(4) & " " & StrValue
                    ElseIf chuc > 1 Then
                        StrValue = So(chuc) & " " & So1(5) & " " & StrValue
                    End If
                End If
                If tram < 0 Then
                    Exit Do
                Else
                    If tram > 0 Or chuc > 0 Or donvi > 0 Then
                        StrValue = So(tram) & " " & "trăm" & " " & StrValue 'Lưu ý bảng mã 
                    End If
                End If
            Loop
        End If
        For I = 1 To 3
            StrValue = StrValue.Replace(Hang(I), Hang(I) & "")
        Next
        StrValue = StrValue.Replace(", " & Hang(3), " " & Hang(3))
        StrValue = Trim(StrValue)
        StrValue = StrValue.TrimEnd(",")
        StrValue = UCase(Microsoft.VisualBasic.Left(StrValue, 1)) & Microsoft.VisualBasic.Right(StrValue, Len(StrValue) - 1)
        NumToText = StrValue
    End Function
End Module
